//
//  WBMainViewController.swift
//  Weibo
//
//  Created by FF on 16/11/27.
//  Copyright © 2016年 Cold Wind. All rights reserved.
//

import UIKit


// 主控制器
class WBMainViewController: UITabBarController {

    //载入完成，可以进行自定义数据以及动态创建其他控件
    //      一个APP在载入时会先通过调用loadView方法或者载入IB中创建的初始界面的方法，将视图载入到内存中。然后会调用viewDidLoad方法来进行进一步的设置。通常，我们对于各种初始数据的载入，初始设定等很多内容，都会在这个方法中实现，所以这个方法是一个很常用，很重要的方法。
    
    //但是要注意，这个方法只会在APP刚开始加载的时候调用一次，以后都不会再调用它了，所以只能用来做初始设置。
    override func viewDidLoad() {
        super.viewDidLoad()
        setupChildControllers()
        setupComposeButton()
        print(#function)
        // Do any additional setup after loading the view.
    }
    
    /**
        portrait 竖屏  肖像！
        landscape 横屏 风景画！
        
        - 使用代码控制设备的方向，好处： 可以在需要横屏的时候，单独处理！
        - 设置支持的方向之后，当前的控制器及子控制器都会遵守这个方向！
        - 如果播放视屏，通常是通过 modal 展现的！
     */
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
    // 撰写按钮
    fileprivate lazy var composeButton: UIButton = UIButton.cz_imageButton("tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")

    // MARK: - 监听方法
    // //撰写微博
    // FIXME:没有实现
    // fileprivate  保证当前方法私有，仅在当前对象被访问
    // @objc : 允许这个函数在 ‘运行时’ 通过OC的消息机制调用！
    @objc fileprivate func composeState() {
        print("撰写微博")
        
        // 横屏测试，使用 modal 实现横屏
        let vc = UIViewController()
        vc.view.backgroundColor = UIColor.cz_random()
        let nav = UINavigationController(rootViewController: vc)
        present(nav, animated: true, completion: nil)
        
    }
    
    //      系统在载入所有数据后，将会在屏幕上显示视图，这时会先调用这个方法。通常我们会利用这个方法，对即将显示的视图做进一步的设置。例如，我们可以利用这个方法来设置设备不同方向时该如何显示。
    
    
   // 另外一方面，当APP有多个视图时，在视图间切换时，并不会再次载入viewDidLoad方法，所以如果在调入视图时，需要对数据做更新，就只能在这个方法内实现了。所以这个方法//也非常常用。
    override func viewWillAppear(_ animated: Bool) {
        print(#function)
    }
    //      有时候，由于一些特殊的原因，我们不能在viewWillApper方法里，对视图进行更新。那么可以重写这个方法，在这里对正在显示的视图进行进一步的设置。
    override func viewDidAppear(_ animated: Bool) {
        print(#function)
    }
    // 在视图变换时，当前视图在即将被移除、或者被覆盖时，会调用这个方法进行一些善后的处理和设置。
    
   // 由于在IOS4之后，系统允许将APP在后台挂起，所以在按了Home键之后，系统并不会调用这个方法，因为就这个APP本身而言，APP显示的view，仍是挂起时候的view，所以并不会调用这个方法。
    override func viewWillDisappear(_ animated: Bool) {
        print(#function)
    }
    //我们可以重写这个方法，对已经消失，或者被覆盖，或者已经隐藏了的视图做一些其他操作。
    override func viewDidDisappear(_ animated: Bool) {
        print(#function)
    }
    
    
    
    
    

}


//extension 类似 OC 中的分类，在 Swfit 中 可以切分代码块， 可以把相近功能的函数放在一个extension，便于代码维护
// 注意： 和OC的分类一样，extension 中不能定义属性，可以定义计算型属性     extension 中不能实现父类的方法！实现父类的方法是子类的职责！
// MARK: 设置界面

extension WBMainViewController {
    
    // 设置撰写按钮
   fileprivate func setupComposeButton() {
        
        // 设置撰写按钮位置
        let count = CGFloat(childViewControllers.count)
        
        // 将向内缩进的宽度减少，能够让按钮的宽度变大，盖住人从点，防止穿帮！
        let w = tabBar.bounds.width / count - 1
        //let w1 = view.bounds.width
        
       // let cgR = CGRect(x: 0, y: 0, width: 300, height: 300)
       // let cgRR = cgR.insetBy(dx: -20, dy:-20)
        
        //print(cgRR)
        tabBar.addSubview(composeButton)
        //print(tabBar.bounds.width)
       // print(w1)
        //CGRectInset 正数向内缩进，负数向外拓展
        composeButton.frame = tabBar.bounds.insetBy(dx: w * 2, dy: 0)
        
      //  print(tabBar.bounds)
       // print(tabBar.bounds.insetBy(dx: 60, dy: 0))
        
        composeButton.addTarget(self, action: #selector(composeState), for: .touchUpInside)
    }
    // 设置所有子控制器
     fileprivate func setupChildControllers() {
        
        // 1 > 获取沙盒 json 路径
        let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]//-- 获取沙盒目录
        let jsonPath = (docDir as NSString).appendingPathComponent("main.json")
        // 通过 json 创建 data
        var data = NSData(contentsOfFile: jsonPath)
        // 判断 data 是否有内容，如果没有，说明本地沙盒没有文件
        if data == nil {
            // 从 bundle 中加载 data
            let path = Bundle.main.path(forResource: "main.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
        }
        // 反序列化生成数组
        guard
            // NSArray(contentsOfFile: path)  是从.plist 文件获取
            //let array =  NSArray(contentsOfFile: path) as? [[String : Any]]
            let array = try? JSONSerialization.jsonObject(with: data as! Data, options: []) as? [[String : Any]]
            else {
            return
        }
        

        
        
//        
//        // 现在很多APP中，界面的创建信息依赖网络json实现
//        let array: [[String : Any]] = [
//            ["clsName": "WBHomeViewController", "title": "首页", "imageName": "home",
//             "visitorInfo": ["imageName": "", "message": "关注一些人，回这里看看有什么惊喜"]
//            ],
//            ["clsName": "WBMessageViewController", "title": "消息", "imageName": "message_center",
//             "visitorInfo": ["imageName": "visitordiscover_image_message", "message": "登陆后，别人评论你的微博，发给你的消息，都会在这里收到通知"]
//            ],
//            ["clsName": "UIViewController"],
//            ["clsName": "WBDiscoverViewController", "title": "发现", "imageName": "discover",
//            "visitorInfo": ["imageName": "visitordiscover_image_message", "message": "登陆后，最新、最热微薄尽在掌握，不再会与事实潮流插件而过"]
//            ],
//            ["clsName": "WBProfileViewController", "title": "我", "imageName": "profile",
//             "visitorInfo": ["imageName": "visitordiscover_image_profile", "message": "登陆后，你的微博、相册、个人资料会显示在这里，展示给别人"]
//            ]
//        ]
//        
//        // 写入沙盒，测试数据格式是否正确 --  转换成plist 数据更加直观
//        // String 、 Array 、 Dictionary 转换直接用 as
//      //  (array as NSArray).write(toFile: "/Users/FF/Desktop/demo.plist", atomically: true)
//        let data = try! JSONSerialization.data(withJSONObject: array, options: [.prettyPrinted])
//        (data as NSData).write(toFile: "/Users/FF/Desktop/demo.json", atomically: true)
        
        
        // 遍历数组，循环创建控制器
        var arrayM = [UIViewController]()
        for dict in array! {
            arrayM.append(controller(dict: dict))
        }
        // 设置 tarBar 子控制器
        //viewControllers 是个数组
       viewControllers  = arrayM
   
    }
    
    
    /// 使用字典创建一个子控制器
    ///
    /// - Parameter dict: 字典信息 [clsName, title, imageName, visitorInfo]
    /// - Returns: 子控制器
    fileprivate func controller(dict: [String: Any]) -> UIViewController {
        // 1. 取得字典内容
        guard let clsName = dict["clsName"] as? String,
            let title = dict["title"] as? String,
                let imageName = dict["imageName"] as? String,
            //    将 clsName 转成 cls
                let cls = NSClassFromString(Bundle.main.namespace + "." + clsName) as? WBBaseViewController.Type,
        let visitorInfo = dict["visitorInfo"] as? [String: String]
            else {
                return UIViewController()
        }
        print(cls)
        
        
        // 2. 创建视图控制器
        let vc = cls.init()
        vc.visitorDict = visitorInfo
        vc.title = title

        // 3. 设置图像
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
        //MARK: withRenderingMode 返回个渲染图像， .alwaysOriginal 始终绘制图片原始状态
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(.alwaysOriginal)
        // 设置tabBarItem字体颜色
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.orange], for: .selected)
        //使用.highlighted 会报这个错误，原因不明
        //button text attributes only respected for UIControlStateNormal, UIControlStateSelected, UIControlStateFocused, and UIControlStateDisabled. state = 1 is interpreted as UIControlStateSelected.
        
       // vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.orange], for: .highlighted)

        // 设置tabBarItem字体大小，只有在normal状态下有效   12 是默认字体大小， .normal 等于 UIControlState(rawValue: 0)
       // vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 15)], for: .normal)
       // vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 12)], for: UIControlState(rawValue: 0))
        // WBNavigationController 相当于 调用 WBNavigationController 的 push 方法
        let nav = WBNavigationController(rootViewController: vc)
        return nav
    }
    
}
